package com.cskaoyan.market.shiro;

import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.stereotype.Component;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;

/**
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2024/7/1 11:35
 * @Version 1.0
 * shiro想要进行认证、鉴权，需要借助于会话管理才可以实现
 * 识别出客户的请求是来自于哪个客户端的，需要借助于会话技术（因为HTTP协议无状态性）
 * 默认情况下，shiro的session行为是和httpSession是一致的，默认情况下是通过获取Cookie:JSESSIONID的值来获取session的编号
 * 但是shiro的session不仅可以支持从Cookie:JSESSIONID来获取session的编号，还可以支持从自定义请求头中获取session的编号
 */
@Component
public class MarketSessionManager extends DefaultWebSessionManager {

    public static final String X_Cskaoyan_Market_Token = "X-CskaoyanMarket-Token";

    //shiro会调用，在获取session的编号时，会调用该方法
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {

        String header = WebUtils.toHttp(request).getHeader(X_Cskaoyan_Market_Token);
        if(header != null){
            return header;
        }
        return super.getSessionId(request, response);
    }
}
